home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1983-03-23 | 4.0 KB | 93 lines |
- 10 REM MSQUARE WRITTEN BY BILL WEIL 1983
- 20 REM THIS PROGRAM PRINTS AND DISPLAYS MAGIC SQUARES
- 30 REM
- 40 REM
- 50 REM
- 60 REM PRINT EXPLANATION **********************************************
- 70 REM
- 100 CLS
- 110 PRINT " THIS PROGRAM PRINTS MAGIC SQUARES."
- 115 PRINT
- 120 PRINT "A MAGIC SQUARE IS AN ARRAY OF CONSECUTIVE NUMBERS WHERE ALL THE"
- 130 PRINT "ROWS, COLUMNS AND DIAGONALS ADD UP TO THE SAME NUMBER. THE ALGORITHM"
- 140 PRINT "USED CAN CALCULATE MAGIC SQUARES OF ANY SIZE AS LONG AS THE NUMBERS OF"
- 150 PRINT "ROWS AND COLUMNS ARE AN ODD NUMBER."
- 153 REM
- 154 REM
- 155 REM GOTO 910 'BYPASSES EXPLANATION ************************************
- 156 REM
- 157 PRINT
- 160 PRINT "THE LARGEST MAGIC SQUARE THAT CAN FIT ON AN 80 COLUMN SCREEN IS"
- 170 PRINT "19 BY 19. THE LARGEST SQUARE THAT CAN PRINT ON AN IBM OR EPSON MX-80"
- 180 PRINT "PRINTER IS 31 BY 31 IN COMPRESSED MODE (17.16 cpi). THE LARGEST SQUARE"
- 190 PRINT "THAT CAN PRINT ON AN EPSON MX-100 IN COMPRESSED MODE IS 45 BY 45."
- 200 PRINT
- 210 PRINT "THIS PROGRAM PRINTS A DOUBLE WIDTH HEADING LINE BY SPECIFYING A"
- 220 PRINT "CHR$(14) AND PRINTS THE MAGIC SQUARE ITSELF IN COMPRESSED MODE"
- 230 PRINT "BY SPECIFYING A CHR$(15). THE PROGRAM ALSO ASSUMES A 132 POSITION"
- 240 PRINT "PRINT LINE. TO CUSTOMIZE THIS PROGRAM FOR YOUR PRINTER CHANGE THE"
- 250 PRINT "FOLLOWING LINES OF CODE: 910, 940-960, 10615-10630, 10900-10910"
- 260 PRINT
- 270 PRINT "TO BYPASS THESE INSTRUCTIONS REMOVE THE REM FROM LINE 155"
- 280 PRINT
- 860 REM
- 870 REM
- 880 REM
- 890 REM START UP *********************************************************
- 900 REM
- 910 WIDTH "LPT1:",132 'EPSON MX-80 PRINTS 132 COLUMNS IN COMPRESSED MODE
- 920 DEFINT C,O,R,S
- 930 PRINT
- 940 INPUT "ENTER AN ODD NUMBER FROM 3 T0 31: ",SIZE
- 960 IF SIZE < 3 OR SIZE > 31 THEN PRINT "NUMBER IS NOT WITHIN RANGE": GOTO 930
- 970 IF SIZE MOD 2 = 0 THEN PRINT "MUST BE AN ODD NUMBER": GOTO 930
- 980 DIM TABLE(SIZE,SIZE)
- 990 SIZESQ = SIZE^2 'THIS IS THE NUMBER OF CELLS IN THE ARRAY
- 1000 IF SIZE <= 31 THEN PICTURE$ = "####" ELSE PICTURE$ = "#####" 'THIS IS USED FOR WIDE PRINTERS
- 1010 PRINT: PRINT:
- 10000 REM
- 10010 REM
- 10020 REM
- 10030 REM FILL ARRAY *******************************************************
- 10040 REM
- 10100 COL = (SIZE +1)/2 -1 'SET POSITION SO THAT LINES 10280 AND 10300 CAUSE
- 10120 ROW = 2 'THE PROGRAM TO START AT THE MIDDLE OF THE TOP ROW
- 10200 FOR COUNT = 1 TO SIZESQ
- 10240 OLDCOL = COL: OLDROW = ROW 'SAVE LAST ELEMENT POSITION
- 10280 COL = COL + 1 'FILL IN ARRAY BY MOVING UP TO THE RIGHT
- 10300 ROW = ROW - 1 'DIAGONALLY
- 10340 IF COL > SIZE THEN COL = 1 'WRAP FROM RIGHT TO LEFT
- 10360 IF ROW = 0 THEN ROW = SIZE 'WRAP FROM TOP TO BOTTOM
- 10400 IF TABLE(ROW,COL) <> 0 THEN COL = OLDCOL: ROW = OLDROW + 1
- 10410 REM IF CELL IS OCCUPIED THEN DROP DOWN ONE ROW FROM OLD POSITION
- 10450 TABLE(ROW,COL) = COUNT
- 10500 IF COUNT MOD 100 = 0 OR COUNT = SIZESQ THEN LOCATE 23,10: PRINT "WORKING ON NUMBER "; COUNT; " OF "; SIZESQ
- 10540 NEXT COUNT
- 10560 REM
- 10570 REM
- 10580 REM
- 10590 REM PRINT ARRAY ****************************************************
- 10600 REM
- 10610 IF SIZE <= 19 THEN CLS: PRINT "A "; SIZE; " BY "; SIZE; " MAGIC SQUARE": PRINT
- 10615 LPRINT CHR$(12) 'GO TO TOP OF FORM
- 10620 LPRINT CHR$(14) "A" SIZE "BY" SIZE "MAGIC SQUARE"
- 10630 LPRINT CHR$(15) 'SET TO COMPRESSED PRINT MODE
- 10640 FOR ROW = 1 TO SIZE
- 10680 FOR COL = 1 TO SIZE
- 10720 LPRINT USING PICTURE$; TABLE(ROW,COL);
- 10730 IF SIZE <= 19 THEN PRINT USING PICTURE$; TABLE(ROW,COL);
- 10760 NEXT COL
- 10800 LPRINT
- 10820 IF SIZE <= 19 THEN PRINT
- 10840 NEXT ROW
- 10860 REM
- 10870 REM
- 10880 REM
- 10890 REM FINISH UP *******************************************************
- 10895 REM
- 10900 LPRINT CHR$(18) 'RESTORE TO NORMAL PRINT
- 10910 WIDTH "LPT1:",80 'RESTORE TO 80 COLUMN WIDTH
- 10940 LPRINT "THE SUM OF EACH ROW, COLUMN AND DIAGONAL IS" SIZE*(SIZESQ+1)/2
- 10950 IF SIZE <= 19 THEN PRINT: PRINT "THE SUM OF EACH ROW, COLUMN AND DIAGONAL IS" SIZE*(SIZESQ+1)/2
- 10999 END
-